package _0_6_回文子串_子序列_编辑距离

/*
原题链接:
https://leetcode.cn/problems/maximum-subarray/

53. 最大子数组和
给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
子数组 是数组中的一个连续部分。

给你一个整数数组 nums, 请你找出一个具有最大和的连续子数组 (子数组最少包含一个元素), 返回其最大和

示例 1：
输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
输出：6
解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。

示例 2：
输入：nums = [1]
输出：1

示例 3：
输入：nums = [5,4,-1,7,8]
输出：23

思路:
一. dp数组含义
  - dp[i]: 包含下标i(以nums[i]为结尾) 的最大连续子序列和为dp[i]

二. 确定递推公
  - dp[i]只有两个方向可以推出来
  - dp[i-1] + nums[i], 即: nums[i]加入当前连续子序列和
  - nums[i], 即: 从头开始计算当前连续子序列和
    一定是最大的, 所以dp[i] = max(dp[i-1] + nums[i], nums[i])

三. 初始化
  - 从递推公式可以看出来dp[i]是依赖于dp[i-1]的状态, dp[0]就是递推公式的基础
    dp[0] = nums[0]

四. 确定遍历顺序
  - 递推公式中dp[i]依赖于dp[i-1]的状态, 需要从前向后遍历

五. 打印dp数组
*/
func maxSubArray(nums []int) int {
	n := len(nums) //获取数组长度

	dp := make([]int, n) // 这里的dp[i] 表示，最大的连续子数组和，包含num[i] 元素
	dp[0] = nums[0]      // 初始化，由于dp 状态转移方程依赖dp[0]

	mx := nums[0] // 初始化最大的和
	for i := 1; i < n; i++ {
		dp[i] = max(dp[i-1]+nums[i], nums[i]) // 这里的状态转移方程就是：求最大和  会面临2种情况，一个是带前面的和，一个是不带前面的和
		mx = max(mx, dp[i])
	}

	return mx
}
